package multisistema.objetos;

import java.util.ArrayList;
import java.util.List;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.ResultSet;
import multisistema.db.MySQL;

public class Miembro {

    private int id;
    private String nombre;
    private String direccion;
    private String dui;
    private String telefonoFijo;
    private String telefonoCelular;
    private String correo;
    private String fechaNacimiento;
    private boolean estado;
    String digicel = "@digimensajes.com";
    String claro = "@sms.claro.com.sv";
    String tigo = "@tigo.com.sv";

    public Miembro() {
        id = -1;
        nombre = "";
        direccion = "";
        telefonoCelular = "";
        telefonoFijo = "";
        correo = "";
        fechaNacimiento = "";
        estado = true;
    }

    public Miembro(int id) {
        this.id = id;
        getById();
    }

    private void getById() {
        Statement stmt = null;
        ResultSet rs = null;
        MySQL mydb = new MySQL();
        Connection conn = mydb.getConn();
        try {
            stmt = conn.createStatement();
            if (stmt.execute("SELECT * FROM `tbl_personas` WHERE `id_persona` = " + this.getId())) {
                rs = stmt.getResultSet();
            }
            if (rs.next()) {
                this.setNombre(rs.getString("nombre_persona"));
                this.setDireccion(rs.getString("direccion"));
                this.setDui(rs.getString("DUI"));
                this.setTelefonoFijo(rs.getString("telefono_fijo"));
                this.setTelefonoCelular(rs.getString("telefono_celular"));
                this.setCorreo(rs.getString("correo_electronico"));
                this.setFechaNacimiento(rs.getDate("fecha_nacimiento").toString());
                this.setEstado(rs.getBoolean("estado_persona"));
            } else {
                this.setId(-1);
            }
        } catch (SQLException ex) {
            System.out.println("SQLException: " + ex.getMessage());
            System.out.println("SQLState: " + ex.getSQLState());
            System.out.println("VendorError: " + ex.getErrorCode());
        } finally {
            if (rs != null) {
                try {
                    rs.close();
                } catch (SQLException sqlEx) {
                }
                rs = null;
            }
            if (stmt != null) {
                try {
                    stmt.close();
                } catch (SQLException sqlEx) {
                }
                stmt = null;
            }
        }
        try {
            conn.close();
        } catch (SQLException ex) {
            System.out.println("SQLException: " + ex.getMessage());
            System.out.println("SQLState: " + ex.getSQLState());
            System.out.println("VendorError: " + ex.getErrorCode());
        }
    }

    /**
     * @return the id
     */
    public int getId() {
        return id;
    }

    /**
     * @param id the id to set
     */
    public void setId(int id) {
        this.id = id;
    }

    /**
     * @return the nombre
     */
    public String getNombre() {
        return nombre;
    }

    /**
     * @param nombre the nombre to set
     */
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    /**
     * @return the direccion
     */
    public String getDireccion() {
        return direccion;
    }

    /**
     * @param direccion the direccion to set
     */
    public void setDireccion(String direccion) {
        this.direccion = direccion;
    }

    /**
     * @return the dui
     */
    public String getDui() {
        return dui;
    }

    /**
     * @param dui the dui to set
     */
    public void setDui(String dui) {
        this.dui = dui;
    }

    /**
     * @return the telefonoFijo
     */
    public String getTelefonoFijo() {
        return telefonoFijo;
    }

    /**
     * @param telefonoFijo the telefonoFijo to set
     */
    public void setTelefonoFijo(String telefonoFijo) {
        this.telefonoFijo = telefonoFijo;
    }

    /**
     * @return the telefonoCelular
     */
    public String getTelefonoCelular() {
        return telefonoCelular;
    }

    public String getDigits(int i) {
        if (i > 4) {
            return getTelefonoCelular().substring(0, 4) + getTelefonoCelular().substring(5, 1 + i);
        }
        return getTelefonoCelular().substring(0, i);
    }

    public boolean isClaro() {
        double d = Double.parseDouble(getDigits(4));
        double d5 = Double.parseDouble(getDigits(8));

        if ((7000 <= d && d <= 7069) || (7080 <= d && d <= 7099) || (7600 <= d && d <= 7669) || (7687 <= d && d <= 7690) || (7687 <= d && d <= 7690) || (7740 <= d && d <= 7759) || (d == 7803) || (7805 <= d && d <= 7809) || (7840 <= d && d <= 7844) || (7850 <= d && d <= 7869) || (7950 <= d && d <= 7969) || (7985 <= d && d <= 7989)) {
            return true;
        } else if ((70700000 <= d5 && d5 <= 70700999) || (70705000 <= d5 && d5 <= 70705999) || (70709000 <= d5 && d5 <= 70709999) || (70710000 <= d5 && d5 <= 70710999) || (78025000 <= d5 && d5 <= 78025999)) {
            return true;
        }
        return false;
    }

    public boolean isTigo() {
        double d2 = Double.parseDouble(getDigits(2));
        double d = Double.parseDouble(getDigits(4));
        double d5 = Double.parseDouble(getDigits(8));
        if (d2 == 60 || d2 == 72) {
            return true;
        } else if ((7670 <= d && d <= 7685) || (7720 <= d && d <= 7739) || (7470 <= d && d <= 7599) || (7870 <= d && d <= 7949) || (7785 <= d && d <= 7789) || (7795 <= d && d <= 7799)) {
            return true;
        } else if ((70701000 <= d5 && d5 <= 70701999) || (76860000 <= d5 && d5 <= 76864999)) {
            return true;
        }
        return false;
    }

    public boolean isDigicel() {
        double d2 = Double.parseDouble(getDigits(2));
        double d = Double.parseDouble(getDigits(4));
        double d5 = Double.parseDouble(getDigits(8));
        if (d2 == 62) {
            return true;
        } else if ((7695 <= d && d <= 7698) || (7460 <= d && d <= 7469) || (7300 <= d && d <= 7449) || (7970 <= d && d <= 7979) || (7801 == d) || (7760 <= d && d <= 7779)) {
            return true;
        } else if ((78020000 <= d5 && d5 <= 78024999)) {
            return true;
        }
        return false;
    }

    public String getValidCell() {
        if (isClaro()) {
            return getDigits(8) + claro;
        }
        if (isDigicel()) {
            return "503" + getDigits(8) + digicel;
        }
        if (isTigo()) {
            return getDigits(8) + tigo;
        }
        return null;
    }

    /**
     * @param telefonoCelular the telefonoCelular to set
     */
    public void setTelefonoCelular(String telefonoCelular) {
        this.telefonoCelular = telefonoCelular;
    }

    /**
     * @return the correo
     */
    public String getCorreo() {
        return correo;
    }

    /**
     * @param correo the correo to set
     */
    public void setCorreo(String correo) {
        this.correo = correo;
    }

    /**
     * @return the fechaNacimiento
     */
    public String getFechaNacimiento() {
        return fechaNacimiento;
    }

    /**
     * @param fechaNacimiento the fechaNacimiento to set
     */
    public void setFechaNacimiento(String fechaNacimiento) {
        this.fechaNacimiento = fechaNacimiento;
    }

    /**
     * @return the estado
     */
    public boolean isEstado() {
        return estado;
    }

    /**
     * @param estado the estado to set
     */
    public void setEstado(boolean estado) {
        this.estado = estado;
    }

    public void agregar() {
        Statement stmt = null;
        ResultSet rs = null;
        MySQL mydb = new MySQL();
        Connection conn = mydb.getConn();
        try {
            stmt = conn.createStatement();
            stmt.executeUpdate("INSERT INTO `multisistema`.`tbl_personas` "
                    + "(`id_persona`, `nombre_persona`, `direccion`, `DUI`, `telefono_fijo`, "
                    + "`telefono_celular`, `correo_electronico`, `fecha_nacimiento`, `estado_persona`)"
                    + " VALUES (NULL, '" + this.getNombre() + "', '" + this.getDireccion() + "', '" + this.getDui()
                    + "', '" + this.getTelefonoFijo() + "', '" + this.getTelefonoCelular() + "', '" + this.getCorreo() + "', '"
                    + this.getFechaNacimiento() + "', '" + (this.isEstado() ? "1" : "0") + "');");

            rs = stmt.executeQuery("SELECT LAST_INSERT_ID()");
            if (rs.next()) {
                this.setId(rs.getInt(1));
            }
        } catch (SQLException ex) {
            System.out.println("SQLException: " + ex.getMessage());
            System.out.println("SQLState: " + ex.getSQLState());
            System.out.println("VendorError: " + ex.getErrorCode());
        } finally {

            if (rs != null) {
                try {
                    rs.close();
                } catch (SQLException ex) {
                    // ignore
                }
            }

            if (stmt != null) {
                try {
                    stmt.close();
                } catch (SQLException ex) {
                    // ignore
                }
            }
        }
    }

    public void modificar() {
        Statement stmt = null;
        ResultSet rs = null;
        MySQL mydb = new MySQL();
        Connection conn = mydb.getConn();
        try {
            stmt = conn.createStatement();
            stmt.executeUpdate("UPDATE `multisistema`.`tbl_personas` SET "
                    + "`nombre_persona` = '" + this.getNombre()
                    + "', `direccion` = '" + this.getDireccion()
                    + "', `DUI` = '" + this.getDui()
                    + "', `telefono_fijo` = '" + this.getTelefonoFijo()
                    + "', `telefono_celular` = '" + this.getTelefonoCelular()
                    + "', `correo_electronico` = '" + this.getCorreo()
                    + "', `fecha_nacimiento` = '" + this.getFechaNacimiento()
                    + "', `estado_persona` = '" + (this.isEstado() ? "1" : "0")
                    + "' WHERE id_persona = '" + this.getId()
                    + "';");

            rs = stmt.executeQuery("SELECT LAST_INSERT_ID()");
            if (rs.next()) {
                this.setId(rs.getInt(1));
            }
        } catch (SQLException ex) {
            System.out.println("SQLException: " + ex.getMessage());
            System.out.println("SQLState: " + ex.getSQLState());
            System.out.println("VendorError: " + ex.getErrorCode());
        } finally {

            if (rs != null) {
                try {
                    rs.close();
                } catch (SQLException ex) {
                    // ignore
                }
            }

            if (stmt != null) {
                try {
                    stmt.close();
                } catch (SQLException ex) {
                    // ignore
                }
            }
        }
    }

    public void eliminar() {
        Statement stmt = null;
        ResultSet rs = null;
        MySQL mydb = new MySQL();
        Connection conn = mydb.getConn();
        try {
            stmt = conn.createStatement();
            stmt.executeUpdate("DELETE FROM `multisistema`.`tbl_personas` WHERE `tbl_personas`.`id_persona` = " + this.getId() + ";");
        } catch (SQLException ex) {
            System.out.println("SQLException: " + ex.getMessage());
            System.out.println("SQLState: " + ex.getSQLState());
            System.out.println("VendorError: " + ex.getErrorCode());
        } finally {

            if (rs != null) {
                try {
                    rs.close();
                } catch (SQLException ex) {
                    // ignore
                }
            }

            if (stmt != null) {
                try {
                    stmt.close();
                } catch (SQLException ex) {
                    // ignore
                }
            }
        }
    }

    public static List<Miembro> getMiembros() {
        List<Miembro> lista = new ArrayList<Miembro>();
        Statement stmt = null;
        ResultSet rs = null;
        MySQL mydb = new MySQL();
        Connection conn = mydb.getConn();
        try {
            stmt = conn.createStatement();
            if (stmt.execute("SELECT * FROM `tbl_personas` ")) {
                rs = stmt.getResultSet();
            }

            while (rs.next()) {
                Miembro mien = new Miembro();
                mien.setId(rs.getInt("id_persona"));
                mien.setNombre(rs.getString("nombre_persona"));
                mien.setDireccion(rs.getString("direccion"));
                mien.setDui(rs.getString("DUI"));
                mien.setTelefonoFijo(rs.getString("telefono_fijo"));
                mien.setTelefonoCelular(rs.getString("telefono_celular"));
                mien.setCorreo(rs.getString("correo_electronico"));
                mien.setFechaNacimiento(rs.getDate("fecha_nacimiento").toString());
                mien.setEstado(rs.getBoolean("estado_persona"));
                lista.add(mien);
            }
        } catch (SQLException ex) {
            System.out.println("SQLException: " + ex.getMessage());
            System.out.println("SQLState: " + ex.getSQLState());
            System.out.println("VendorError: " + ex.getErrorCode());
        } finally {
            if (rs != null) {
                try {
                    rs.close();
                } catch (SQLException sqlEx) {
                }
                rs = null;
            }
            if (stmt != null) {
                try {
                    stmt.close();
                } catch (SQLException sqlEx) {
                }
                stmt = null;
            }
        }
        try {
            conn.close();
        } catch (SQLException ex) {
            System.out.println("SQLException: " + ex.getMessage());
            System.out.println("SQLState: " + ex.getSQLState());
            System.out.println("VendorError: " + ex.getErrorCode());
        }
        return lista;
    }

    public static List<Miembro> buscar(String campo, String valor) {
        List<Miembro> lista = new ArrayList<Miembro>();
        Statement stmt = null;
        ResultSet rs = null;
        MySQL mydb = new MySQL();
        Connection conn = mydb.getConn();
        if (campo.equals("estado_persona")) {
            valor = valor.toLowerCase();
            if (valor.equals("activo")) {
                valor = "1";
            }
            if (valor.equals("inactivo")) {
                valor = "0";
            }
        }
        try {
            stmt = conn.createStatement();
            if (stmt.execute("SELECT * FROM `tbl_personas` WHERE `" + campo + "` LIKE '%" + valor + "%';")) {
                rs = stmt.getResultSet();
            }

            while (rs.next()) {
                Miembro mien = new Miembro();
                mien.setId(rs.getInt("id_persona"));
                mien.setNombre(rs.getString("nombre_persona"));
                mien.setDireccion(rs.getString("direccion"));
                mien.setDui(rs.getString("DUI"));
                mien.setTelefonoFijo(rs.getString("telefono_fijo"));
                mien.setTelefonoCelular(rs.getString("telefono_celular"));
                mien.setCorreo(rs.getString("correo_electronico"));
                mien.setFechaNacimiento(rs.getDate("fecha_nacimiento").toString());
                mien.setEstado(rs.getBoolean("estado_persona"));
                lista.add(mien);
            }
        } catch (SQLException ex) {
            System.out.println("SQLException: " + ex.getMessage());
            System.out.println("SQLState: " + ex.getSQLState());
            System.out.println("VendorError: " + ex.getErrorCode());
        } finally {
            if (rs != null) {
                try {
                    rs.close();
                } catch (SQLException sqlEx) {
                }
                rs = null;
            }
            if (stmt != null) {
                try {
                    stmt.close();
                } catch (SQLException sqlEx) {
                }
                stmt = null;
            }
        }
        try {
            conn.close();
        } catch (SQLException ex) {
            System.out.println("SQLException: " + ex.getMessage());
            System.out.println("SQLState: " + ex.getSQLState());
            System.out.println("VendorError: " + ex.getErrorCode());
        }
        return lista;
    }
}
